Add two implementations split10 and split11#6
Open
rep-movsd wants to merge 3 commits intotobbez:masterfrom
Open
Add two implementations split10 and split11#6rep-movsd wants to merge 3 commits intotobbez:masterfrom
rep-movsd wants to merge 3 commits intotobbez:masterfrom
Conversation
================================================== split10 --------- This is a simple implementation that uses std::find() It uses a for loop with two variables: itStart - iterator start of a word itDelimiter - iterator to a delimiter We get the result of find() for the next delimiter in itDelim and then save the range (itStart, itDelim) as a token, and emplace the string into the result vector This very simple 5 liner shows that good C++ code can beat C code without any trouble -------------------------------------------------------------------------- split11 ---------- Almost the same as split10 but we use a StringRef class just like the one in split6. Instead of iterators we use a char pointer This speeds it up by almost a factor of 80% We get pretty close to the subparser version, only about 15% slower on my system. -------------------------------------------------------------------------- Benchmark results (trimmed output for 80 columns) ------------------------------------------------- $ ./run_all.bash === System info Arch rolling Linux 4.5.5-1-ck x86_64 GNU/Linux Intel(R) Core(TM) CPU X 920 @ 2.00GHz g++ (GCC) 6.1.1 20160501 Python 3.5.1 === End System info ./split.py Python: 38.9 seconds. Crunch Speed: 514293.2 ./split5.py Python: 41.0 seconds. Crunch Speed: 488168.6 ./split1 C++ : 8.7 seconds. Crunch speed: 2288344.6 ./split2 C++ : 20.9 seconds. Crunch speed: 958164.2 ./split6 C++ : 3.6 seconds. Crunch speed: 5603155.4 ./split7 C++ : 2.6 seconds. Crunch speed: 7750547.7 ./split8 C++ : 31.0 seconds. Crunch speed: 644411.0 ./split9 C++ : 21.1 seconds. Crunch speed: 949104.7 ./split10 C++ : 3.7 seconds. Crunch speed: 5387448.0 ./split11 C++ : 2.3 seconds. Crunch speed: 8703679.3 ./split_subparser C++ : 2.0 seconds. Crunch speed: 9956735.4 ./splitc1 C++ : 7.9 seconds. Crunch speed: 2519434.9 ./splitc2 C++ : 8.0 seconds. Crunch speed: 2484935.2 ./splitc3 C++ : 8.0 seconds. Crunch speed: 2515293.7 $
Same as split11 except use memchr() Now this is as fast or faster than split_subparser -march=SSE2 and so on might be even faster
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
split10
This is a simple implementation that uses std::find()
It uses a for loop with two variables:
itStart - iterator start of a word
itDelimiter - iterator to a delimiter
We get the result of find() for the next delimiter in itDelim and then
save the range (itStart, itDelim) as a token, and emplace the string into
the result vector
This very simple 5 liner shows that good C++ code can beat C code without
any trouble
split11
Almost the same as split10 but we use a StringRef class just like the
one in split6. Instead of iterators we use a char pointer
This speeds it up by almost a factor of 80%
We get pretty close to the subparser version, only about 15% slower on my
system.
Benchmark results (trimmed output for 80 columns)
$ ./run_all.bash
=== System info
Arch rolling
Linux 4.5.5-1-ck x86_64 GNU/Linux
Intel(R) Core(TM) CPU X 920 @ 2.00GHz
g++ (GCC) 6.1.1 20160501
Python 3.5.1
=== End System info
./split.py Python: 38.9 seconds. Crunch Speed: 514293.2
./split5.py Python: 41.0 seconds. Crunch Speed: 488168.6
./split1 C++ : 8.7 seconds. Crunch speed: 2288344.6
./split2 C++ : 20.9 seconds. Crunch speed: 958164.2
./split6 C++ : 3.6 seconds. Crunch speed: 5603155.4
./split7 C++ : 2.6 seconds. Crunch speed: 7750547.7
./split8 C++ : 31.0 seconds. Crunch speed: 644411.0
./split9 C++ : 21.1 seconds. Crunch speed: 949104.7
./split10 C++ : 3.7 seconds. Crunch speed: 5387448.0
./split11 C++ : 2.3 seconds. Crunch speed: 8703679.3
./split_subparser C++ : 2.0 seconds. Crunch speed: 9956735.4
./splitc1 C++ : 7.9 seconds. Crunch speed: 2519434.9
./splitc2 C++ : 8.0 seconds. Crunch speed: 2484935.2
./splitc3 C++ : 8.0 seconds. Crunch speed: 2515293.7
$